package com.itheima.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * SpringMvc就是三层架构思想中：
 *      表现层->业务层->数据层   中用于表现层开发的，说白了就是Controller层中的那一套其实是属于SpringMvc技术，简化Servlet开发
 * 要求：
 *      1.会用SpringMvc接受请求和响应
 *      2.使用Restful风格开发
 *      3.根据业务需求完成前后端与数据库整合     ->前后端之间靠SpringMvc技术连接起来的
 *      4.SSM整合开发
 * Web程序的执行流程：
 *      前端 页面发送异步请求到后端，后端由表现层来接收请求，得到数据再提交给业务层，业务层进行逻辑处理后再交给数据层进行数据访问
 *      数据层执行完毕后将得到的数据返回给业务层，业务层再返回给表现层，表现层将数据以json格式返回给前端，前端将数据进行解析并呈现在页面上
 *      数据层学习了JDBC,MyBatis框架，表现层之前是用Servlet技术，现在为了简化Servlet开发，引入了SpringMvc框架来简化
 *
 * SpringMvc是基于Java的实现MVC模型的轻量级Web框架
 *
 *
 * 入门案例开发流程：
 *      1.导包，SpringMvc的包    -->这个包携带了Spring-context包    ,   javax-servlet-api包
 *      2.创建SpringMvc控制类，其实就是Controller中的一个类，因为使用的是Spring技术，所以要把他声明成一个bean,但这里面不用@Component,必须用@Controller
 *      3.初始化SpringMvc配置环境，做一个配置类，同Spring
 *      4.初始化Servlet容器，Spring环境配置好了，但tomcat启动后要加载SpringMvc的东西，所以要配置
 *
 *  1.导入坐标      -->SpringMvc坐标中大部分都是Spring的坐标，并且还导入了一个web开发的专用jar包
 *  2.添加源代码目录
 *
 */

/**
 * 定义Controller
 * 用@Controller声明成为bean
 * SpringMvc的配置类中要扫描到controller
 *
 *
 * SpringMvc就是  1 + N
 *      配置只做一次，但请求方法可以做 N 次
 *
 * 工作流程分析：
 *      1.容器初始化的过程：
 *          1.服务器启动，加载并执行 ServletContainerInitConfig 类，初始化了Web容器，
 *          2.执行第一个方法 createServletApplicationContext ，得到了一个 WebApplicationContext 对象，这个对象就是SpringMvc容器最终体现的对象
 *          ，此时他已经加载到了web容器，位于ServletContext中
 *          3.接着注册了SpringMvc的配置，这就是加载配置
 *          4.加载@ComponentScan中的bean
 *          5.加载UserController，每一个加了@RequestMapping的都关联一个方法，比如 /save -> save(),但这个对应关系是所有的已启动一管理的
 *          6.执行GetServletMapping方法，定义所有方法由SpringMvc处理
 *      2.单次请求处理过程：
 *          1.发送请求 localhost:8080/save,他首先拦截请求，然后交给SpringMvc处理
 *          2.SpringMvc解析请求路径，就是找到与/save对应的save()方法
 *          3.执行save()
 *          4.检测到有@ResponseBody注解，将save()返回值直接作为响应体
 */
@Controller     //类注解 ，专门用于SpringMvc的，将controller类声明成为bean
public class UserController {

    /**
     * 设置访问路径
     * 添加@ResponseBody，因为返回的数据是以JSON格式的，这个注解相当于能把数据（字符串，对象等等）转成JSON格式
     * 另外相当于@RequestMapping相当于接受请求的注解，@ResponseBody相当于用于响应的注解
     *
     * 当然。RestController整合了@Controller和@ResponseBody
     * @return
     */
    @RequestMapping("/save")    //访问路径
    @ResponseBody   //
    public String save() {
        System.out.println("springmvc save running...");

        return "{'module':'springmvc'}";
    }
}
